#include "ytscr.h"

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <string.h>
#include <stdbool.h>
#include <stdio.h>

#define LCD_XRES 800
#define LCD_YRES 480
#define TSCR_XRES 1024
#define TSCR_YRES 600
#define X_TO_LCD LCD_XRES*1.0/TSCR_XRES
#define Y_TO_LCD LCD_YRES*1.0/TSCR_YRES

// static void read_firstPos(Pos *pos, int tp);
// static void read_lastPos(Pos *pos, int tp);
static inline void to_lcdPos(Pos *pos)
{
    pos->x = pos->x * X_TO_LCD;
    pos->y = pos->y * Y_TO_LCD;
}
// static void __read_pos(Pos *pos);

bool read_pos(Pos *firstPos, Pos *lastPos)
{
    bool ret_isreadFirst = false;
    int tp = open("/dev/input/event0", O_RDWR);
    // if (tp == 0)
        // fprintf(stderr, "%d\n", __LINE__);
    // if (firstPos != NULL) read_firstPos(firstPos, tp);
    // if (lastPos != NULL) read_lastPos(lastPos, tp);

    Pos p;
    struct input_event event;
    int isTouch = 0;    // 1 表示按下  -1 表示松开 
    while (1){
        if (read(tp, &event, sizeof(event)) == -1){
            perror("read error");
            return ret_isreadFirst;
        }
        if (event.type == EV_KEY && event.code == BTN_TOUCH){
            if (event.value > 0){
                isTouch = 1;
            }else if (event.value==0){
                isTouch = -1;
                if (lastPos){
                    *lastPos = p;
                    to_lcdPos(lastPos);
                }
                break;
            }
        }else if (event.type == EV_ABS){
            if (event.code == ABS_X)
                p.x = event.value;
            else if(event.code == ABS_Y){
                p.y = event.value;
                if (isTouch == 1 && firstPos){
                    // fprintf(stderr, "read firstPos\n");
                    ret_isreadFirst = true;
                    *firstPos = p;
                    to_lcdPos(firstPos);
                }
                // break;
                isTouch = 0;
            }
        }
    }

    close(tp);
    return ret_isreadFirst;
}

// static void read_firstPos(Pos *pos, int tp)
// {
//     bool s = false;
//     struct input_event buf;

//     while (1){
//         bzero(&buf, sizeof(buf));
//         read(tp, &buf, sizeof(buf));

//         if (buf.type == EV_KEY && buf.code == BTN_TOUCH){
//             if (buf.value > 0){
//                 s=true;
//                 // printf("buf.type == EV_KEY && buf.code == BTN_TOUCH && buf.value > 0\n");
//             }
//         }else if (buf.type == EV_ABS && s){
//             if (buf.code == ABS_X ){
//                 pos->x = buf.value;
//                 // printf("x = %d ", pos->x);
//             }else if (buf.code == ABS_Y){
//                 pos->y = buf.value;
//                 // printf("y = %d\n", pos->y);
//                 break;
//             }
//         }
//     }
//     to_lcdPos(pos);
//     // printf("return x = %d, y = %d\n", pos->x, pos->y);
// }

// static void read_lastPos(Pos *pos, int tp)
// {
//     struct input_event buf;
//     Pos curr;
//     // bool s = false;

//     while (1){
//         bzero(&buf, sizeof(buf));
//         read(tp, &buf, sizeof(buf));

//         if (buf.type == EV_KEY && buf.code == BTN_TOUCH){
//             if (buf.value == 0) {
//                 // s = true;
//                 // printf("buf.type == EV_KEY && buf.code == BTN_TOUCH && buf.value == 0\n");
//                 break;
//             }
//         }else if ( buf.type == EV_ABS){
//             if (buf.code == ABS_X ){
//                 curr.x = buf.value;
//                 // printf("x = %d", curr.x);
//             }else if (buf.code == ABS_Y){
//                 curr.y = buf.value;
//                 // printf("y = %d\n", curr.y);
//                 // break;

//             }
//         }
//     }
//     *pos = curr;
//     // printf("return curr x = %d, y = %d\n", curr.x, curr.y);
//     // printf("return fixsur x = %d, y = %d\n", pos->x, pos->y);
//     to_lcdPos(pos);
//     printf("return x = %d, y = %d\n", pos->x, pos->y);
// }

// static void __read_pos(Pos *pos);